<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>递归深拷贝实现</title>
</head>
<body>
    <script>
        // deepClone(function(){})
        //递归深拷贝函数封装
        /**
         * 深拷贝数据
         * @params data  要克隆的数据
         * @return container 要返回的新数据
         */
        function deepClone(data, s=new Map()){
            //引用数据类型的数据  
            if(typeof data === 'object' && data !== null){
                //拷贝数据之前, 先检查 map 中是否有缓存
                if(s.has(data)){
                    return s.get(data);
                }
                //数组 对象
                let isArray = Array.isArray(data);
                //声明一个变量容器
                let container = isArray ? [] : {};
                //将新的克隆的数据保存在 Map 中
                s.set(data, container);
                //遍历目标数据  []  {}   for...in
                for(let key in data){
                    container[key] = deepClone(data[key], s);
                }
                return container;
            }else{
                //基本数据类型的数据  function
                return data;
            }
        }
        // let arr = [1,2,3];
        //要克隆的数据
        const school = {
            name: '尚硅谷',
            pos: ['北京','上海','深圳','武汉','西安'],
            founder: {
                name:'刚哥',
                age: 45
            },
            //方法
            improve: function(){
                console.log('提升自己');
            }
        };

        //相互引用赋值操作
        school.pos.push(school.founder);
        school.founder.pos = school.pos;

        //调用函数 拷贝数据
        let result = deepClone(school);

        result.pos[0] = 'beijing';

        console.log(school);
        console.log(result);
       
        

    </script>
</body>
</html>